﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);//p是临时开辟的指针，这个函数执行完p就会销毁，开辟的动态空间就找不到了
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);//此时str仍然是空指针，无法输出
//	strcpy(str, "hello world");
//	printf(str);
//}
//int main()
//{
//	Test();
//	return 0;
//}
//char* GetMemory(void)
//{
//	char p[] = "hello world";//这个函数调用完之后，函数栈帧就会销毁，这个空间就有可能被别人占用
//	return p;
//}
//void Test(void)
//{
//	char* str = NULL;
//	str = GetMemory();//
//	printf(str);
//}
#include<stdlib.h>
#include<string.h>
//void GetMemory(char** p, int num)
//{
//	*p = (char*)malloc(num);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str, 100);
//	strcpy(str, "hello");
//	printf(str);	
//	//没有释放空间，会导致内存泄漏。
//	//free(str)
//	//str=NULL
//}
//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, "hello");
//	free(str);//这个时候内存释放了，开辟的动态空间就没了，str就成了野指针
//	if (str != NULL)
//	{
//		strcpy(str, "world");//这里非法访问，尽管他可以正常运行。
//		printf(str);
//	}
//}
//int main()
//{
//	Test();
//	return 0;
//	}
//柔性数组
/* 柔性数组的特点：
• 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
• sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
• 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配，并且分配的内存应该⼤于结构的⼤
⼩，以适应柔性数组的预期⼤⼩。*/
//typedef struct type
//{
//	int i;
//	int arr[];
//}s;
//int main()
//{
//	printf("%zd", sizeof(s));//4
//	return 0;
//}
//int main()
//{
//	int i = 0;
//	s* p = (s*)malloc(sizeof(s) + 100 * sizeof(int));
//	p->i = 100;
//	for (i = 0; i < 100; i++)
//	{
//		p->arr[i] = i;
//	}
//	for (i = 0; i < 100; i++)
//		printf("%d ", p->arr[i]);
//	//最后释放空间
//	free(p);
//	p = NULL;//避免p成为野指针
//	return 0;
//}
//typedef struct student
//{
//	int age;      // 4 8 4
//	char name[20];// 1 8 1  4+20=24
//	char arr[];
//}type;
//int main()
//{
//	//printf("%zd", sizeof(type));//24
//	type* p = (type*)malloc(sizeof(type) + 100 * sizeof(char));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	p->age = 20;
//	p->name[20] = "zhangsan";
//	return 0;
//}
//typedef struct student 
//{
//	int i;
//	int* pa;
//}s;
//int main()
//{
//	printf("%zd\n", sizeof(s));
//	s* p = (s*)malloc(sizeof(s));
//	p->i = 1000;
//	p->pa = (int*)malloc(p->i* sizeof(int));
//	int i = 0;
//	for (i = 0; i < 100; i++)
//	{
//		p->pa[i] = i;
//	}
//	for (i = 0; i < 100; i++)
//		printf("%d ", p->pa[i]);
//  free(p);
//  p=NULL;
//	return 0;
//}
//这个方法需要申请两次动态空间，不如直接用柔性数组。
		